from django.shortcuts import render
from rest_framework.generics import CreateAPIView
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView, RetrieveAPIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import UpdateAPIView
from rest_framework import status

from rest_framework_jwt.views import obtain_jwt_token

from .serializers import UserSerializer
from .models import User
from .serializers import UserDetailSerializer, EmailSerializer
# Create your views here.

"""
1.接收参数 token
2.对参数进行解密处理
3.取出参数中的用户信息
4.对用户的信息进行查询
5.判断,如果用户存在,修改用户的邮箱激活信息,进行保存
"""


# GET /email/verification/?token=xxx
class VerifyEmailView(APIView):
    """验证用户邮箱"""

    def get(self, request):
        # 1.接收参数 token
        token = request.query_params.get("token")
        # 对参数进行校验
        if not token:
            return Response({"message": "缺少token"}, status=status.HTTP_400_BAD_REQUEST)
        # 2.对参数进行解密处理
        user = User.check_email_token(token)
        if not user:
            return Response({"message": "用户不存在"}, status=status.HTTP_400_BAD_REQUEST)
        # 修改user的email_active字段
        user.email_active = True
        user.save()

        return Response({'message': 'ok'})


"""
1.接受邮箱参数 email
2.对邮箱参数进行校验
3.保存邮箱
4.生产邮箱链接
5.发送邮件(异步发送)
"""


class EmailView(UpdateAPIView):
    """添加用户邮箱"""
    # 指定序列化器
    serializer_class = EmailSerializer
    # 设置权限,只有以注册的用户才能访问
    permission_classes = [IsAuthenticated]

    # 重写get_object方法
    def get_object(self):
        return self.request.user


"""
0.给用户模型类添加邮箱激活字段,进行数据迁移
1.用户个人中心业务逻辑:
    1.1 用户点击个人用户中心,如果为未登录用户,就会跳转登录界面
    1.2 定义一个详情视图,继承为retrieveAPiview,为get的请求,路由为user/info/
    1.3 由于前端的路由中没有pk,我们需要自定使用request.user获取用户信息
    1.4.定义一个序列化器,将用户的个人信息进行序列化输出
    1.5 由于是用户的个人信息,需要添加权限校验
"""


class UserDetailView(RetrieveAPIView):
    """登录用户详情信息"""
    # 指定查询集
    # queryset = User.objects.all()
    # 指定序列化器
    serializer_class = UserDetailSerializer
    # 设置权限,只有以注册的用户才能访问
    permission_classes = [IsAuthenticated, ]

    # 重写get_object方法
    def get_object(self):
        return self.request.user

#  POST /users/
class UserAPIView(CreateAPIView):
    """注册用户模块"""
    serializer_class = UserSerializer


# GET usernames/(?P<username>\w{5,20})/count/
class UserNameCountView(APIView):
    """判断用户是否存在"""

    def get(self, requset, username):
        # 根据获得参数username,查询用户是否存在
        count = User.objects.filter(username=username).count()
        # 组织数据进行返回
        data = {
            "count": count,
            "username": username
        }
        return Response(data=data)


# GET mobiles/(?P<mobile>\1[3-9]\d{9})/count/
class MobileCountView(APIView):
    """判断手机号是否存在"""

    def get(self, request, mobile):
        # 根据获得手机号查询用户是否存在
        count = User.objects.filter(mobile=mobile).count()
        # 组织数据进行返回
        data = {
            "count": count,
            "mobile": mobile
        }
        return Response(data=data)
